import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
#股票综合评估
# ------------ 函数定义 ------------
def entropy_weight(data):
    data = pd.DataFrame(data).replace(0, 1e-9)
    data_norm = data / data.sum(axis=0)
    entropy = -np.sum(data_norm * np.log(data_norm), axis=0) / np.log(len(data))
    weight = (1 - entropy) / np.sum(1 - entropy)
    return weight.values

def topsis(data, weights, impacts):
    norm_data = data / np.linalg.norm(data, axis=0)
    ideal_best = np.max(norm_data * impacts, axis=0)
    ideal_worst = np.min(norm_data * impacts, axis=0)
    d_best = np.sqrt(np.sum((norm_data - ideal_best)**2 * weights, axis=1))
    d_worst = np.sqrt(np.sum((norm_data - ideal_worst)**2 * weights, axis=1))
    return d_worst / (d_best + d_worst)

# ------------ 主流程 ------------
df = pd.read_excel(r"F:\上市公司综合数据\LHTZ评估数据.xlsx")

# 1. 数据清洗
df = df[(df['ROE'] > 0) & (df['均值法年化'] > 0) & (df['几何平均法年化'] > 0)]

# 2. 指标处理
criteria = ['ROE', '净利润(亿元)', '均值法年化', '几何平均法年化', '4.资产周转率', '资产负债率']
data = df[criteria].copy()
data['资产负债率'] = 1 - data['资产负债率']  # 负向转正向

# 3. 标准化与权重
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)
weights = entropy_weight(data_scaled)

# 4. TOPSIS评分
impacts = np.array([1, 1, 1, 1, 1, 1])
df['综合评分'] = topsis(data_scaled, weights, impacts)
df['排名'] = df['综合评分'].rank(ascending=False)

# 输出
print(df[['股票代码', '公司名称', 'ROE', '均值法年化', '几何平均法年化', '综合评分', '排名']]
      .sort_values('排名').head(37))

output_columns = [
    '股票代码', '公司名称', '所在省份', 'ROE',
    '均值法年化', '几何平均法年化',
    '净利润(亿元)', '综合评分', '排名'
]

# 生成排序后的结果
result_df = df[output_columns].sort_values('排名')

# 导出为CSV（兼容Excel中文）
output_path = r"F:\上市公司综合数据\LHTZ评估数据导出.csv"
result_df.to_csv(output_path,
                index=False,         # 不保存行索引
                encoding='utf-8-sig', # 支持Excel中文
                float_format='%.4f')  # 控制小数位数

print(f"\n结果已保存至：{output_path}")
print("导出字段说明：")
print("- ROE: 净资产收益率")
print("- 均值法年化: 简单平均年化收益率")
print("- 几何平均法年化: 复利年化收益率")